package com.yxx.handler;

import cn.dev33.satoken.exception.DisableServiceException;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import com.yxx.exception.ServiceException;
import com.yxx.entityModel.vo.Result.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

import static com.yxx.enums.StatusCodeEnum.*;


/**
 * 全局异常处理
 * 全局处理控制器（Controller）层的异常和响应数据 @ControllerAdvice 和 @ResponseBody 结合体
 * @author yuxiangxun
 * @date 2025/1/19
 * @apiNote
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 业务异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = ServiceException.class)
    public ResponseResult<?> handleServiceException(ServiceException e){
        log.error(" 业务异常,查看异常信息：{}",e);
        return ResponseResult.fail(e.getMessage());
    }

    /**
     * Assert异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = IllegalArgumentException.class)
    public ResponseResult<?> handleIllegalArgumentException(IllegalArgumentException e){
        log.error(" Assert异常,查看异常信息：{}",e);
        return ResponseResult.fail(e.getMessage());
    }

    /**
     * 处理参数校验异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseResult<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
        log.error("处理参数校验异常,查看异常信息：{}",e);
        return ResponseResult.fail(VALID_ERROR.getCode(), Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
    }

    /**
     * 权限不足异常
     * @return
     */
    @ExceptionHandler(value = NotPermissionException.class)
    public ResponseResult<?> handleNotPermissionException(NotPermissionException nex){
        log.error("权限不足异常,查看异常信息：{}",nex);
        return ResponseResult.fail("权限不足");
    }

    /**
     * 账号封禁
     * @return
     */
    @ExceptionHandler(value = DisableServiceException.class)
    public ResponseResult<?> handleDisableServiceException(DisableServiceException dse){
        log.error("账号封禁,查看异常信息：{}",dse);
        return ResponseResult.fail("此账号已被禁止访问服务");
    }

    /**
     * 无此角色异常
     * @return
     */
    @ExceptionHandler(value = NotRoleException.class)
    public ResponseResult<?> handleNotRoleException(NotRoleException nrl) {
        log.error("无此角色异常,查看异常信息：{}",nrl);
        return ResponseResult.fail("权限不足");
    }

    /**
     * SaToken异常
     * @param nle
     * @return
     */
    @ExceptionHandler(value = NotLoginException.class)
    public ResponseResult<?> handlerNotLoginException(NotLoginException nle) {
        log.info("没有登录异常：{}",nle);
        // 判断场景值，定制化异常信息
        String message;
        if (nle.getType().equals(NotLoginException.NOT_TOKEN)) {
            message = "未提供token";
        } else if (nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
            message = "token无效";
        } else if (nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
            message = "token已过期";
        } else {
            message = "当前会话未登录";
        }
        // 返回给前端
        return ResponseResult.fail(UNAUTHORIZED.getCode(), message);
    }

    /**
     * 系统异常
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public ResponseResult<?> handleSystemException(Exception ex) {
        log.error("系统异常,查看异常信息：{}",ex);
        return ResponseResult.fail(SYSTEM_ERROR.getCode(), SYSTEM_ERROR.getMsg());
    }
}
